/*
 * @Description: 二进制数据解析
 * @Version: 1.0
 * @Autor: wangmeng
 * @Date: 2025-01-13 18:28:28
 * @LastEditors: wamgmeng
 * @LastEditTime: 2025-01-14 10:45:40
 */

// 告警类型枚举
enum WarningType {
    总体 = 1,
    任务 = 2,
    导航 = 3,
    飞行性能 = 5,
    视觉降落 = 6,
    传感器故障 = 7,
    仿真 = 8
}

// 告警数据接口
interface WarningData {
    type_warning: WarningType;
    idx: number;
    var1: number;
    var2: number;
    var3: number;
    var4: number;
    var5: number;
}


/*
Offset 的概念
offset 是偏移量，表示在二进制数据中的位置。想象它就像一个数组的索引，告诉我们从哪里开始读取数据。
数据类型的字节数
每种数据类型占用固定的字节数：
uint8: 占用 1 字节
uint16: 占用 2 字节
int32: 占用 4 字节
*/


// 解析数据
function parseWarningData(buffer: ArrayBuffer): WarningData {
    const dataView = new DataView(buffer);
    let offset = 0;  // 从0开始

    // 1. 读取 type_warning (uint8 = 1字节)
    const type_warning = dataView.getUint8(offset);  // 从位置0开始读取1字节
    offset += 1;  // 移动1个字节，现在 offset = 1

    // 2. 读取 idx (uint16 = 2字节)
    const idx = dataView.getUint16(offset, true);  // 从位置1开始读取2字节
    offset += 2;  // 移动2个字节，现在 offset = 3

    // 3. 读取 var1 (int32 = 4字节)
    const var1 = dataView.getInt32(offset, true);  // 从位置3开始读取4字节
    offset += 4;  // 移动4个字节，现在 offset = 7

    // 4. 读取 var2 (int32 = 4字节)
    const var2 = dataView.getInt32(offset, true);  // 从位置7开始读取4字节
    offset += 4;  // 移动4个字节，现在 offset = 11

    // 5. 读取 var3 (int32 = 4字节)
    const var3 = dataView.getInt32(offset, true);  // 从位置11开始读取4字节
    offset += 4;  // 移动4个字节，现在 offset = 15

    // 6. 读取 var4 (int32 = 4字节)
    const var4 = dataView.getInt32(offset, true);  // 从位置15开始读取4字节
    offset += 4;  // 移动4个字节，现在 offset = 19

    // 7. 读取 var5 (int32 = 4字节)
    const var5 = dataView.getInt32(offset, true);  // 从位置19开始读取4字节

    return {
        type_warning,
        idx,
        var1,
        var2,
        var3,
        var4,
        var5
    };
}




// 使用示例
function example() {
    // 创建一个模拟的二进制数据
    const buffer = new ArrayBuffer(23); // 1 + 2 + (5 * 4) = 21 bytes
    const view = new DataView(buffer);



    // 写入测试数据

    // type_warning
    view.setUint8(0, WarningType.导航);
    // idx
    view.setUint16(1, 1234, true);
    // var1
    view.setInt32(3, 100, true);
    // var2
    view.setInt32(7, 200, true);
    // var3
    view.setInt32(11, 300, true);
    // var4
    view.setInt32(15, 400, true);
    // var5
    view.setInt32(19, 500, true);

    // 解析数据
    const result = parseWarningData(buffer);
    console.log('解析结果:', result);
}


example();